package br.com.biblioteca.Dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.biblioteca.Connect.Conexao;
import br.com.biblioteca.Modelo.Cliente;

public class ClienteDao {
	private PreparedStatement ps = null;
	private Conexao conexao = new Conexao();

	// inserir livro
	public boolean insertCliente(Cliente cliente) throws SQLException {
		boolean retorno = false;

		try {
			String sql = "insert into tb_cliente (nm_cliente, nr_cpf, tp_sexo) values (?, ?, ?);";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setString(1, cliente.getNmCliente());
			ps.setString(2, cliente.getNrCpf());
			ps.setInt(3, cliente.getTpSexo());

			int insert = ps.executeUpdate();

			if (insert != 0) {
				retorno = true;
			} else {
				retorno = false;
			}

			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	// atualizar cliente
	public boolean updateCliente(Cliente cliente) throws SQLException {
		boolean retorno = false;

		try {
			String sql = "update tb_cliente set nm_cliente = ?, nr_cpf = ?, tp_sexo = ? where id = ?;";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setString(1, cliente.getNmCliente());
			ps.setString(2, cliente.getNrCpf());
			ps.setInt(3, cliente.getTpSexo());
			ps.setInt(4, cliente.getId());

			int update = ps.executeUpdate();

			if (update != 0) {
				retorno = true;
			} else {
				retorno = false;
			}

			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	// deletar cliente
	public boolean deleteCliente(Cliente cliente) throws SQLException {
		boolean retorno = false;

		try {
			String sql = "delete from tb_cliente where id = ?;";
			ps = conexao.getConnection().prepareStatement(sql);
			ps.setInt(1, cliente.getId());

			int delete = ps.executeUpdate();

			if (delete != 0) {
				retorno = true;
			} else {
				retorno = false;
			}

			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return retorno;
	}

	// Listar ALL Clientes ou busca filtrada
	public List<Cliente> listClientes(Cliente cliente) throws SQLException {
		List<Cliente> listCliente = null;

		try {
			String sql = null;

			if (cliente != null) {
				sql = "select * from tb_cliente where";
				boolean or = false;

				if (cliente.getNmCliente() != null && cliente.getNmCliente().trim().length() > 0) {
					sql += " nm_cliente like + '%" + cliente.getNmCliente() + "%'";
					or = true;
				}

				else if (cliente.getNrCpf() != null && cliente.getNrCpf().trim().length() > 0) {
					if (or) {
						sql += " or nr_cpf like + '%" + cliente.getNrCpf() + "%'";
					} else {
						sql += " nr_cpf like + '%" + cliente.getNrCpf() + "%'";
					}
				}

				else if (cliente.getTpSexo() != null) {
					if (or) {
						sql += " or tp_sexo = " + cliente.getTpSexo();
					} else {
						sql += " tp_sexo = " + cliente.getTpSexo();
					}
				}

				sql += " order by nm_cliente;";

			} else {
				sql = "select * from tb_cliente ;";

			}

			ps = conexao.getConnection().prepareStatement(sql);

			ResultSet rs = ps.executeQuery();

			if (!rs.equals(null)) {
				listCliente = new ArrayList<Cliente>();
			}

			Cliente clienteAux = null;

			while (rs.next()) {
				clienteAux = new Cliente();
				clienteAux.setId(rs.getInt("id"));
				clienteAux.setNmCliente(rs.getString("nm_cliente"));
				clienteAux.setNrCpf(rs.getString("nr_cpf"));
				clienteAux.setTpSexo(rs.getInt("tp_sexo"));
				listCliente.add(clienteAux);
			}

			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}

		return listCliente;
	}

	// Get cliente
	public Cliente getCliente(int id) throws SQLException {
		Cliente cliente = null;
		
		try {
			String sql = "select * from tb_cliente ;";
			
			ps = conexao.getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				cliente = new Cliente();
				cliente.setId(rs.getInt("id_cliente"));
				cliente.setNmCliente(rs.getString("nm_cliente"));
				cliente.setTpSexo(rs.getInt("tp_sexo"));
			}
			
			rs.close();
			ps.close();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new SQLException(e);
		} finally {
			conexao.closeConnection();
		}
		
		return cliente;
	}

}
